package vargapeter.bet.server;

import java.util.Random;

import vargapeter.bet.SportEventBase;

/**
 * Sportesemények osztálya.
 */
public class SportEvent extends SportEventBase {
	private int betStart;
	private int eventStart;
	private boolean ongoing;
	private String outcome;
	private String[] outcomes = new String[] { SportEventBase.HOME, SportEventBase.AWAY, SportEventBase.DRAW };

	public SportEvent(String eventName, int homeOdds, int awayOdds, int drawOdds, int betStart, int eventStart) {
		super(eventName, homeOdds, awayOdds, drawOdds);
		this.betStart = betStart;
		this.eventStart = eventStart;
	}

	public int getBetStart() {
		return betStart;
	}

	public int getEventStart() {
		return eventStart;
	}

	/**
	 * Csak akkor tér vissza igazzal, ha az esemény épp elkezdődik. Ha már folyamatban van vagy véget ért, akkor hamisat ad. Ha elkezdődik, akkor a folyamatban áll változót igazzá teszi.
	 * 
	 * @param elapsedTime
	 * @return
	 */
	public boolean isStarting(int elapsedTime) {
		if (getBetStart() <= elapsedTime && !ongoing && !ended) {
			ongoing = true;
			return true;
		}
		return false;
	}

	/**
	 * Csak akkor tér vissza igazzal ha az esemény véget ért.
	 * 
	 * @param elapsedTime
	 * @return
	 */
	public boolean isEnded(int elapsedTime) {
		if (getEventStart() <= elapsedTime && ongoing) {
			ongoing = false;
			ended = true;
			return true;
		}
		return false;
	}

	/**
	 * A kimenetel véletlen.
	 * 
	 * @return
	 */
	public String getOutcome() {
		Random rnd = new Random();
		if (outcome == null) {
			outcome = outcomes[rnd.nextInt(3)];
		}
		//outcome="h";
		return outcome;
	}

	/**
	 * Visszaadja az X-hez tartozó odds-ot ami 25% -al eltérhet az eredetitől.
	 * 
	 * @return
	 */
	public int getDistortedDraw() {
		return distort(drawOdds);
	}

	/**
	 * Visszaadja a Vendéghez tartozó odds-ot ami 25% -al eltérhet az eredetitől.
	 * 
	 * @return
	 */
	public int getDistortedAway() {
		return distort(awayOdds);
	}

	/**
	 * Visszaadja a Hazaihoz tartozó odds-ot ami 25% -al eltérhet az eredetitől.
	 * 
	 * @return
	 */
	public int getDistortedHome() {
		return distort(homeOdds);
	}

	/**
	 * Az események nem a tényleges odds-okat továbbítják a fogadóirodának, hanem egy torzított odds-ot ami maximum 25% -al tér el a ténylegestől. Ez a függvény számolja ki a torzított odds-ot.
	 * 
	 * @param num
	 * @return
	 */
	private int distort(int num) {
		Random rnd = new Random();
		/* így a maxDifference 0.75 és 1.25 közé esik, ami pontosan 25% -os eltérés maximum az 1-től */
		double maxDifference = rnd.nextDouble() / 2 + 0.75d;
		return (int) Math.round(num * maxDifference);
	}
}